/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package InstanciaJogo.FasesJogo;

import Biblioteca.VerificaErros;
import ClassesListas.Imagens;
import InstanciaJogo.InstanciaJogoSwing;
import java.awt.Image;
import java.util.Timer;
import java.util.TimerTask;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;

/**
 * Dinamica
 *
 * Versao 1.0
 *
 * Data Criação 04/04/2014
 *
 * @author Igor
 */
public class Dinamica extends InstanciaSubFasePattern {

    //Construtor
    public Dinamica(long subFase) {
        super(subFase);
        setIdFase(2);
    }

    //Outros metodos
    @Override
    public void apresentarImagem(InstanciaJogoSwing instanciaJogo, boolean jogoPausado) throws Exception {
        try {
            Imagens imagensParaApresentar;

            this.tempoParaAvaliar = System.currentTimeMillis();

            //So apresenta a imagem se nao estiver apresentando imagens atualmente
            if (!instanciaJogo.getLabelImagem().equals("imagemRosto")) {
                //Crio o timer antes de apresentar, caso o usuario avalie muito rapidamente
                setTimerApresentarImagem(new Timer());
                if (jogoPausado) {
                    imagensParaApresentar = imagemApresentadaAtual();
                } else {
                    imagensParaApresentar = retornaProximaImagemApresentada();
                    setQuantidadeImagensParaAvaliar(getQuantidadeImagensParaAvaliar() - 1);
                }

                int imagensApresentadas = (this.imagensDinamicas.getImagensApresentadasSubFase().size() - this.getQuantidadeImagensParaAvaliar());

                instanciaJogo.getLabelStatus().setText("Fase: " + instanciaJogo.getFase() + "." + getSubFase()
                        + "     Imagem Apresentada: " + imagensApresentadas + "/" + getImagensDinamicas().getImagensApresentadasSubFase().size());
                instanciaJogo.atualizarLabel(instanciaJogo.getLabelStatus());

                this.getTimerApresentarImagem().schedule(new RemindTaskDinamica(instanciaJogo, this.getTimerApresentarImagem(), instanciaJogo.getTempoApresentacaoImagens(), imagensParaApresentar), 0, ((instanciaJogo.getTempoApresentacaoImagens() * 1000 / 5)));
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, VerificaErros.retornaMensagemErro(e), "Erro!", JOptionPane.ERROR_MESSAGE);
        }
    }

    public void apresentarImagemDinamica(Imagens imagens, InstanciaJogoSwing instanciaJogo) throws Exception {
        int largura = instanciaJogo.getLabelImagem().getWidth();
        int altura = instanciaJogo.getLabelImagem().getHeight();

        ImageIcon ig = new ImageIcon(imagens.getImagens().get(getIndiceImagemApresentada() - 1).getDiretorio().toString());

        //Amplia a imagem fazendo-a ocupar todo o JLabel
        instanciaJogo.getLabelImagem().setIcon(new ImageIcon(ig.getImage().getScaledInstance(largura, altura, Image.SCALE_DEFAULT)));
        instanciaJogo.atualizarLabel(instanciaJogo.getLabelImagem());
        //indiceImagemApresentada++;
    }

    @Override
    public boolean avaliarExpressaoImagem(int idExpressao, long idModoJogo) throws Exception {
        boolean flag = false;
        this.tempoParaAvaliar = System.currentTimeMillis() - this.tempoParaAvaliar;

        //Cancelo o timer pois ja avaliei, entao a troca de imagem nao sera por tempoParaAvaliar e sim realizada neste metodo
        if (this.getTimerApresentarImagem() != null) {
            stopTimer();
        }

        if (this.imagemApresentadaAtual().getImagens().get(this.indiceImagemApresentada - 1).getIdExpressaoResposta() == null) {
            long idExpressao1 = this.imagemApresentadaAtual().getImagens().get(this.indiceImagemApresentada - 1).getIdExpressao();

            //Preenche tds imagens com uma expressao de resposta
            for (int i = 0; i < this.imagemApresentadaAtual().getImagens().size(); i++) {
                this.imagemApresentadaAtual().getImagens().get(i).setIdExpressaoResposta(idExpressao);
            }
            if (idExpressao1 == idExpressao) {
                flag = true;
                setQuantidadeImagensAvaliadasCorretamente(getQuantidadeImagensAvaliadasCorretamente() + 1);
            }
            //So grava a avaliacao se nao estiver no Treinamento
            if (idModoJogo != 1) {
                this.imagemApresentadaAtual().getImagens().get(this.indiceImagemApresentada - 1).gravaImagemApresentadaSubFase(this.idInstanciaSubFase, this.tempoParaAvaliar);
            }
        }

        return flag;
    }

    class RemindTaskDinamica extends TimerTask {

        private InstanciaJogoSwing instanciaJogo = null;
        private Timer timer = null;
        private Imagens imagemApresentada;

        public RemindTaskDinamica(InstanciaJogoSwing jogo, Timer timer, int tempoEspera, Imagens imagemApresentada) {
            this.instanciaJogo = jogo;
            this.timer = timer;
            indiceImagemApresentada = 0;
            this.imagemApresentada = imagemApresentada;
        }

        @Override
        public void run() {
            if (indiceImagemApresentada <= imagemApresentada.getImagens().size()-1) {
                indiceImagemApresentada++;
                try {
                    apresentarImagemDinamica(this.imagemApresentada, this.instanciaJogo);
                } catch (Exception ex) {
                    throw new UnsupportedOperationException(ex); //To change body of generated methods, choose Tools | Templates.
                }
            } else {
                this.timer.cancel();
                stopTimer();
                this.instanciaJogo.getLabelImagem().setIcon(null);
                this.instanciaJogo.atualizarLabel(this.instanciaJogo.getLabelImagem());
                /*Se nao for o modo Treinamento e se estiver aprensentando a imagem com 100% de expressao
                 entao gravarei no BD, pois essa eh a ultima chance de avaliar, caso nao avalie, temos que ter
                 o registro da apresentacao armazenado
                 */
                if (instanciaJogo.getModoJogo() != 1 && imagemApresentada.getImagens().get(indiceImagemApresentada - 1).getIntensidade() == 100) {
                    try {
                        imagemApresentada.getImagens().get(indiceImagemApresentada - 1).gravaImagemApresentadaSubFase(idInstanciaSubFase, 0);
                    } catch (Exception ex) {
                        Logger.getLogger(Dinamica.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
                this.instanciaJogo.apresentaTransicaoImagens();
            }
        }
    }
}
